babl: preliminary work to add float fast path to palette formats
authorØyvind Kolås <pippin@gimp.org>
Wed, 16 May 2018 11:13:26 +0000 (13:13 +0200)
committerØyvind Kolås <pippin@gimp.org>
Wed, 16 May 2018 11:13:29 +0000 (13:13 +0200)
Still not accurate enough to be acceptable, gets accepted by system with
a BABL_TOLERANCe of 0.045 or higher. Needs more work.

babl/babl-palette.c

index 7a06e7d521152364bf42f403ae4b04155ae92d1f..1cc97589b7fd8f33056678176788193aa91eb718 100644 (file)
@@ -340,6 +340,90 @@ rgba_u8_to_pal (Babl          *conversion,
     }
 }
 
+static void
+rgba_float_to_pal_a (Babl          *conversion,
+                     unsigned char *src_b,
+                     unsigned char *dst,
+                     long           n,
+                     void          *src_model_data)
+{
+  BablPalette **palptr = src_model_data;
+  BablPalette *pal;
+  assert (palptr);
+  pal = *palptr;
+  assert(pal);
+  while (n--)
+    {
+      float *src_f = (void*) src_b;
+      unsigned char src[4];
+      int c;
+      for (c = 0; c < 3; c++)
+      {
+        if (src_f[c] >= 1.0f)
+          src[c] = 255;
+        else if (src_f[c] <= 0.0f)
+          src[c] = 0;
+        else
+          src[c] = src_f[c] * 255 + 0.5f;
+      }
+      if (src_f[3] >= 1.0f)
+        src[3] = 255;
+      else if (src_f[3] <= 0.0f)
+        src[3] = 0;
+      else
+        src[3] = src_f[3] * 255 + 0.5f;
+
+
+      dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]);
+      dst[1] = src[3];
+
+      src_b += sizeof (float) * 4;
+      dst += sizeof (char) * 2;
+    }
+}
+
+
+static void
+rgba_float_to_pal (Babl          *conversion,
+                   unsigned char *src_b,
+                   unsigned char *dst,
+                   long           n,
+                   void          *src_model_data)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  BablPalette **palptr = src_model_data;
+  BablPalette *pal;
+  assert (palptr);
+  pal = *palptr;
+  assert(pal);
+  while (n--)
+    {
+      float *src_f = (void*) src_b;
+      unsigned char src[4];
+      int c;
+      for (c = 0; c < 3; c++)
+      {
+        if (src_f[c] >= 1.0f)
+          src[c] = 255;
+        else if (src_f[c] <= 0.0f)
+          src[c] = 0;
+        else
+          src[c] = src_f[c] * 255 + 0.5f;
+      }
+      if (src_f[3] >= 1.0f)
+        src[3] = 255;
+      else if (src_f[3] <= 0.0f)
+        src[3] = 0;
+      else
+        src[3] = src_f[3] * 255 + 0.5f;
+
+      dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]);
+
+      src_b += sizeof (float) * 4;
+      dst += sizeof (char) * 1;
+    }
+}
+
 static void
 rgba_u8_to_pal_a (Babl          *conversion,
                   unsigned char *src,
@@ -602,6 +686,19 @@ const Babl *babl_new_palette (const char  *name,
      "data", palptr,
      NULL);
 
+  babl_conversion_new (
+     babl_format ("R'G'B'A float"),
+     f_pal_a_u8,
+     "linear", rgba_float_to_pal_a,
+     "data", palptr,
+     NULL);
+  babl_conversion_new (
+     babl_format ("R'G'B'A float"),
+     f_pal_u8,
+     "linear", rgba_float_to_pal,
+     "data", palptr,
+     NULL);
+
   babl_set_user_data (model, palptr);
   babl_set_user_data (model_no_alpha, palptr);